基本原理
在MySQL中,只有一种Join算法,就是大名鼎鼎的NestedLoopJoin
,他没有其他很多数据库所提供的HashJoin
,也没有SortMergeJoin
。顾名思义,NestedLoopJoin
实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与Join,则再通过前两个表的Join结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复。
Join 语句的优化
在明白了MySQL中Join的实现原理之后,我们就比较清楚的知道该如何去优化一个一个Join语句了。
尽可能减少Join语句中的NestedLoop的循环总次数;如何减少NestedLoop的循环总次数?最有效的办法只有一个,那就是让驱动表的结果集尽可能的小,这也正是在本章第二节中的优化基本原则之一“永远用小结果集驱动大的结果集”。
优先优化NestedLoop的内层循环
保证Join语句中被驱动表上Join条件字段已经被索引
当无法保证被驱动表的Join条件字段被索引且内存资源充足的前提下,不要太吝惜JoinBuffer的设置